#include "bsp_gpio.h"


void gpio_deinit_init(void)
{
    /* enable the GPIOA clock */
    rcu_periph_clock_enable(RCU_GPIOA);
    /* enable the GPIOB clock */
    rcu_periph_clock_enable(RCU_GPIOB); 
    rcu_periph_clock_enable(RCU_GPIOC); 
    rcu_periph_clock_enable(RCU_GPIOF); 
    /* configure GPIOA_2 GPIOA_7 ADC */ 
    gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, BITS(0,12));
    gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_15);
    gpio_mode_set(GPIOB, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, BITS(0,15));
    gpio_mode_set(GPIOC, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, BITS(0,15));
    gpio_mode_set(GPIOF, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, BITS(0,15));
    gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_5);
    gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_3);
    
    /* configure GPIOB_10 OUTPUT reset*/ 
    gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_10);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);  
    gpio_bit_reset(GPIOB,GPIO_PIN_10);

   /* configure  VAlVA GPIOA_7 OUTPUT reset*/ 
    gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_7);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);  
    gpio_bit_reset(GPIOA,GPIO_PIN_7);


    //  /* configure GPIOA_2/10/6/7 OUTPUT*/ 
    // gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6 | GPIO_PIN_7);
    // gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7);  
    // gpio_bit_reset(GPIOA,GPIO_PIN_6 | GPIO_PIN_7);
    //  /* configure GPIOB_2/10/6/7 OUTPUT*/ 
    // gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_2 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_10);
    // gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_10);  
    // gpio_bit_reset(GPIOB,GPIO_PIN_2 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_10);
    // /* configure GPIOB_3\4\5\9\11 INPUT KEY */ 
    // gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_9 | GPIO_PIN_11);
    // gpio_bit_reset(GPIOB, GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_9 | GPIO_PIN_11);
    // /* configure GPIOA_4 INPUT STB;GPIOA_5 INPUT CHRG;GPIOA 15 INPUT KEY */ 
    // gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_15);
    // gpio_bit_reset(GPIOA, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_15);

   
}

// void gpio_init(void)
// {

//   //gpio_deinit_init();

//   /* enable the GPIOA clock */
//   rcu_periph_clock_enable(RCU_GPIOA);
//   /* enable the GPIOB clock */
//   rcu_periph_clock_enable(RCU_GPIOB); 
//   /* configure GPIOA_2 GPIOA_7 ADC */ 
//   gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_2 | GPIO_PIN_7);
//   /* configure GPIOB_0 ADC */ 
//   gpio_mode_set(GPIOB, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_0);
//   /* configure GPIOB_3\4\5\9\11 INPUT KEY */ 
//   gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_9 | GPIO_PIN_11);
//   /* configure GPIOA_15 INPUT KEY ; GPIOA_4\5 INPUT BAT CHECK*/ 
//   gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_15);
//   /* configure GPIOA_6 OUTPUT PWM*/ 
//   gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6);
//   gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
//   gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_6);
//   /* configure GPIOA_7 OUTPUT PWM*/ 
//   gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);
//   gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);  
//   gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE,GPIO_PIN_7);
//   gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_7);
//   gpio_af_set(GPIOA, GPIO_AF_4, GPIO_PIN_7);
//   /* configure GPIOB_2/10/6/7 OUTPUT*/ 
//   gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_2 | GPIO_PIN_10);
//   gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2 | GPIO_PIN_10);  
//   /* reset GPIOB_2/10/6/7 pin */
//   gpio_bit_reset(GPIOB,GPIO_PIN_2  | GPIO_PIN_10);

// }

void gpio_init(void)
{
    /* enable the GPIOA clock */
    rcu_periph_clock_enable(RCU_GPIOA);
    /* enable the GPIOB clock */
    rcu_periph_clock_enable(RCU_GPIOB); 
    /* configure GPIOA_2 GPIOA_7 ADC */ 
    gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_2 | GPIO_PIN_7);
    /* configure GPIOB_0 ADC */ 
    gpio_mode_set(GPIOB, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_0);
    /* configure GPIOB_3\4\5\9\11 INPUT KEY */ 
    gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_9 | GPIO_PIN_11);
    /* configure GPIOA_15 INPUT KEY ; GPIOA_4\5 INPUT BAT CHECK*/ 
    gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_15);
    /* configure GPIOA_6 OUTPUT PWM*/ 
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);
    gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_6);
    /* configure GPIOA_7 OUTPUT PWM*/ 
    gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);  
    // gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE,GPIO_PIN_7);
    // gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_7);
    // gpio_af_set(GPIOA, GPIO_AF_4, GPIO_PIN_7);
    /* configure GPIOB_2/10/6/7 OUTPUT*/ 
    gpio_mode_set(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_2 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_10);
    gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_10);  
    /* reset GPIOB_2/10/6/7 pin */
    gpio_bit_reset(GPIOB,GPIO_PIN_2 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_10);
}

void wakeup_key_init(void)
{
    /* enable clock */
    rcu_periph_clock_enable(RCU_PMU);
    /* enable the key clock */
    rcu_periph_clock_enable(RCU_CFGCMP);
    /* configure button pin as input */
    gpio_mode_set(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_3);
    gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_5);
    
    /* enable and set key EXTI interrupt to the lowest priority */
    nvic_irq_enable(EXTI2_3_IRQn, 2U);
    nvic_irq_enable(EXTI4_15_IRQn, 2U);
    /* connect key EXTI line to key GPIO pin */
    syscfg_exti_line_config(EXTI_SOURCE_GPIOB, EXTI_SOURCE_PIN3);
    syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN5);
    /* configure key EXTI line */
    exti_init(EXTI_3, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
    exti_init(EXTI_5, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
    exti_interrupt_flag_clear(EXTI_3);
    exti_interrupt_flag_clear(EXTI_5);
}